/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package net.etrs.formathlon.vue.jsf.form.user;

import java.io.InputStream;
import java.io.Serializable;
import java.util.List;
import java.util.LinkedList;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import net.etrs.formathlon.control.exception.ExceptionManager;
import net.etrs.formathlon.entity.formation.Inscription;
import net.etrs.formathlon.entity.formation.Session;
import net.etrs.formathlon.persistance.formation.InscriptionFacade;
import net.etrs.formathlon.persistance.formation.SessionFacade;
import net.etrs.formathlon.vue.jsf.utils.Confirmable;
import net.etrs.formathlon.vue.jsf.utils.GeneralBean;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

/**
 * ManageBean JSF pour les pages traitant de l'administration des émargements.
 * @author OPIF
 */
@ManagedBean
@ViewScoped
public class UserEmargementBean extends GeneralBean implements Confirmable {
     
    @EJB
    private InscriptionFacade inscriptionfacade;
    
    @EJB
    private SessionFacade sessionFacade;
    private Session session;
    
    
    private List<ParticipationGlobale> listParticipationGlobale;
    
    /**
     * Methode d'initialisation.
     */
    @PostConstruct
    public void init(){
        listParticipationGlobale=new LinkedList<ParticipationGlobale>();
        for(Inscription inscription : inscriptionfacade.getListInscriptionValidees(session)){
            listParticipationGlobale.add(new ParticipationGlobale(inscription));
        }
    }
  
    /**
     * Validation de l'ensemble des participations à la formation.
     * Si une case n'est pas cochée, son inscription n'est pas transformée en participation.
     */
    public void valider(){
        try {
            List<Inscription> listInscriptionAyantParticipe=new LinkedList<Inscription>();
            for(ParticipationGlobale participationGlobale : listParticipationGlobale){
                //si la case est cochée (si la personne a participé à la formation)
                if(participationGlobale.participe){
                    //ajout de la participation dans la liste
                    listInscriptionAyantParticipe.add(participationGlobale.getInscription());
                }
            }
            //enregistrement de la liste de participation
            sessionFacade.validerParticipationsEtArchiver(session,listInscriptionAyantParticipe);
            displayMessage("Opération réussie.");
        } catch (Exception ex) {
            displayErreur(ExceptionManager.traiter(ex));
        }
    }
    
    /**
     * Savoir si la session peut être émargée.
     * @return Vrai si la session peut être émargée.
     */
    public boolean canEmarger(){
        if(session!=null){
            return session.getEtat().equals(Session.EtatSession.VERROUILLE);
        }
        return false;
    }

    /**
     * Génération de la feuille d'émargement en PDF.
     * @return Le flux du fichier.
     */    
    public StreamedContent imprimer(){
        try {
            InputStream stream = sessionFacade.getFeuilleEmargement(session);
            displayMessage("Création réussie.");
            return new DefaultStreamedContent(stream, "application/pdf", "emargement.pdf");
        } catch (Exception ex) {
            displayErreur(ExceptionManager.traiter(ex));
            return null;
        }
    }

    /**
     * Retour de confirmation. La demande est acceptée.
     */
    @Override
    public void confirmer() {
        try{
            displayMessage(getMessage("application.UserSeanceBean.confirmer"));
        }
        catch(Exception ex){
            displayErreur(ExceptionManager.traiter(ex));
        }
    }

    /**
     * Retour de confirmation. La demande est annulée.
     */
    @Override
    public void infirmer() {}

    /**
     * @return the session
     */
    public Session getSession() {
        return session;
    }

    /**
     * @param session the session to set
     */
    public void setSession(Session session) {
        this.session = session;
        init();
    }

    /**
     * @return the listParticipationGlobale
     */
    public List<ParticipationGlobale> getListParticipationGlobale() {
        return listParticipationGlobale;
    }

    /**
     * @param listParticipationGlobale the listParticipationGlobale to set
     */
    public void setListParticipationGlobale(List<ParticipationGlobale> listParticipationGlobale) {
        this.listParticipationGlobale = listParticipationGlobale;
    }
    
    /**
     * Classe qui gère la relation entre une inscription et sa participation globale
     * à l'ensemble des séances de la session.
     */
    public class ParticipationGlobale implements Serializable{
        
        private boolean participe;
        private Inscription inscription;

        /**
         * Constructeur par défaut.
         */
        public ParticipationGlobale() {}

        /**
         * Constructeur avec arguments.
         * @param inscription 
         */
        public ParticipationGlobale(Inscription inscription) {
            this.inscription=inscription;
            participe=true;
        }

        /**
         * 
         * @param inscription 
         */
        public void setInscription(Inscription inscription) {
            this.inscription = inscription;
        }

        /**
         * 
         * @return inscription
         */
        public Inscription getInscription() {
            return inscription;
        }

        /**
         * 
         * @param participe 
         */
        public void setParticipe(boolean participe) {
            this.participe = participe;
        }

        /**
         * 
         * @return participe
         */
        public boolean isParticipe() {
            return participe;
        }

    }


}
